package com.haidong.service.impl;

import com.haidong.dao.AccountDao;
import com.haidong.service.AccountService;
import com.haidong.service.LogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


@Service
public class AccountServiceImpl implements AccountService {
    @Autowired
    private AccountDao accountDao;

    // 添加log服务
    @Autowired
    private LogService logService;

    @Override
    // 在需要被事务管理的的方法加上注解
    // 该注解可以写在接口类(方法)和实现类(方法)上,最下方的注释有事务管理相关属性
    @Transactional
    public void transfer(String out, String in, Double money) {
        try {
            // 添加事务管理之后,这个方法没有成功执行,将会回滚
            accountDao.outMoney(out,money);
//            int i = 1/0;
            accountDao.inMoney(in,money);
        } finally {
            logService.log(out, in, money);
        }
    }
}
//          * readOnly：true只读事务，false读写事务，增删改要设为false,查询设为true。
//          * timeout:设置超时时间单位秒，在多长时间之内事务没有提交成功就自动回滚，-1表示不设置超时时间。
//          * rollbackFor:当出现指定异常进行事务回滚
//          * noRollbackFor:当出现指定异常不进行事务回滚

//          并不是所有的异常默认都会回滚,有的异常是小问题,比如一般抛给主调的IOException,所以需要指定这类异常回滚
//           * rollbackForClassName等同于rollbackFor,只不过属性为异常的类全名字符串
//           * noRollbackForClassName等同于noRollbackFor，只不过属性为异常的类全名字符串
//
//            * isolation设置事务的隔离级别
//            * DEFAULT   :默认隔离级别, 会采用数据库的隔离级别
//            * READ_UNCOMMITTED : 读未提交
//            * READ_COMMITTED : 读已提交
//            * REPEATABLE_READ : 重复读取
//            * SERIALIZABLE: 串行化